/*
 * Copyright 2023-2025, Haiku, Inc. All rights reserved.
 * Distributed under the terms of the MIT License.
 *
 * Authors:
 *   Haiku Development Team
 */

#include <asm_defs.h>

.text
.align 3

/* 
 * 内核入口点函数
 * 参数:
 *   a0 - 页表基址
 *   a1 - 内核参数地址
 *   a2 - 内核入口点地址
 *   a3 - 内核栈顶地址
 */
SYMBOL(_arch_enter_kernel):
    // 保存参数
    move    s0, a0      // 页表基址
    move    s1, a1      // 内核参数地址
    move    s2, a2      // 内核入口点地址
    move    s3, a3      // 内核栈顶地址

    // 设置页表基址
    csrwr   s0, CSR_PGDL
    csrwr   zero, CSR_PGDH

    // 设置栈指针
    move    sp, s3

    // 启用MMU
    li.d    t0, 0x10    // CRMD_PG
    csrrd   t1, CSR_CRMD
    or      t1, t1, t0
    csrwr   t1, CSR_CRMD

    // 刷新TLB
    invtlb  0, zero, zero

    // 跳转到内核入口点
    move    a0, s1      // 内核参数地址作为第一个参数
    jr      s2

    // 不应该到达这里
1:  b       1b

.end